﻿using System;
using System.Collections.Generic;
using System.Data;
using System.Data.Linq;
using System.Data.SqlClient;
using System.Linq;
using System.Runtime.Serialization;
using System.Text;
using System.Transactions;
using BS_Gimnasio.General;
using DS_Gimnasio;

namespace BS_Gimnasio.RRHH.Credito
{
    [DataContract()]
    public class cls_Credito : cls_Base
    {
        #region Variables

        private int _idCredito;
        private int _idGimnasio;
        private int _idEmpleado;
        private DateTime _fechaSolicitud;
        private decimal _montoSolicitado;
        private decimal _tasaAnual;
        private short _plazo;
        private int _indicadorCuota;
        private int _idEstado;

        #endregion

        #region Propiedades

        [DataMember()]
        public int IdCredito
        {
            get { return _idCredito; }
            set { _idCredito = value; }
        }

        [DataMember()]
        public int IdGimnasio
        {
            get { return _idGimnasio; }
            set { _idGimnasio = value; }
        }

        [DataMember()]
        public int IdEmpleado
        {
            get { return _idEmpleado; }
            set { _idEmpleado = value; }
        }

        [DataMember()]
        public DateTime FechaSolicitud
        {
            get { return _fechaSolicitud; }
            set { _fechaSolicitud = value; }
        }

        [DataMember()]
        public decimal MontoSolicitado
        {
            get { return _montoSolicitado; }
            set { _montoSolicitado = value; }
        }

        [DataMember()]
        public decimal TasaAnual
        {
            get { return _tasaAnual; }
            set { _tasaAnual = value; }
        }

        [DataMember()]
        public short Plazo
        {
            get { return _plazo; }
            set { _plazo = value; }
        }

        [DataMember()]
        public int IndicadorCuota
        {
            get { return _indicadorCuota; }
            set { _indicadorCuota = value; }
        }

        [DataMember()]
        public int IdEstado
        {
            get { return _idEstado; }
            set { _idEstado = value; }
        }

        #endregion

        #region Metodos Heredados

        public override void InsertarActualizarRegistro(bool tipoOperacion, ref string mensajeError)
        {
            if (tipoOperacion)
            {
                InsertarRegistro(ref mensajeError);
            }

            else
            {
                ActualizarRegistro(ref mensajeError);
            }
        }

        private void InsertarRegistro(ref string mensajeError)
        {
            try
            {
                using (TransactionScope transaction = new TransactionScope())
                {
                    using (dtacls_GimnasioDataContext db = new dtacls_GimnasioDataContext())
                    {
                        db.SP_Insertar_Credito(IdUsuarioInicioSeccion, IdGimnasio, IdEmpleado, FechaSolicitud,
                            MontoSolicitado, TasaAnual, Plazo, IdEstado, ref mensajeError);

                        transaction.Complete();
                    }
                }
            }

            catch (SqlException ex)
            {
                NumeroError = ex.ErrorCode;
                MensajeError = ex.Message;
            }

            catch (Exception e)
            {
                MensajeError = e.Message;
            }
        }

        private void ActualizarRegistro(ref string mensajeError)
        {
            try
            {
                using (TransactionScope transaction = new TransactionScope())
                {
                    using (dtacls_GimnasioDataContext db = new dtacls_GimnasioDataContext())
                    {
                        db.SP_Actualizar_Credito(IdEmpleado);

                        transaction.Complete();
                    }
                }
            }

            catch (SqlException ex)
            {
                NumeroError = ex.ErrorCode;
                MensajeError = ex.Message;
            }

            catch (Exception e)
            {
                MensajeError = e.Message;
            }
        }

        public override cls_Base TraerObjeto()
        {
            throw new NotImplementedException();
        }

        public override bool EliminarRegistro(ref string mensajeError)
        {
            throw new NotImplementedException();
        }

        public override DataTable Listar(int opcion)
        {
            try
            {
                DataTable dt = new DataTable();

                using (dtacls_GimnasioDataContext db = new dtacls_GimnasioDataContext())
                {
                    if (opcion == 1)
                    {
                        ISingleResult<SP_Seleccionar_Detalle_CreditoResult> resultado = db.SP_Seleccionar_Detalle_Credito(IdUsuarioInicioSeccion);

                        dt = cls_Adaptador.ToDataTable(resultado.ToList());
                    }

                    else if (opcion == 2)
                    {
                        dt = CoutaTotalPagar();
                    }
                }

                return dt;
            }

            catch (SqlException ex)
            {
                NumeroError = ex.ErrorCode;
                MensajeError = ex.Message;

                return null;
            }

            catch (Exception e)
            {
                MensajeError = e.Message;

                return null;
            }   
        }

        public override void OtrosProcesos(int opcion, ref object resultado)
        {
            switch (opcion)
            {
                case 1:
                    CalcularDetalleCredito();
                    break;

                case 2:
                    resultado = PromedioCredito();
                    break;

                default:
                    break;
            }
        }

        #endregion

        #region Metodos Propios

        private void CalcularDetalleCredito()
        {
            try
            {
                using (TransactionScope transaction = new TransactionScope())
                {
                    using (dtacls_GimnasioDataContext db = new dtacls_GimnasioDataContext())
                    {
                        db.SP_Calcular_Detalle_Credito(IdEmpleado, MontoSolicitado, Plazo, TasaAnual);

                        transaction.Complete();
                    }
                }
            }

            catch (SqlException ex)
            {
                NumeroError = ex.ErrorCode;
                MensajeError = ex.Message;
            }

            catch (Exception e)
            {
                MensajeError = e.Message;
            }
        }

        private decimal PromedioCredito()
        {
            try
            {
                using (dtacls_GimnasioDataContext db = new dtacls_GimnasioDataContext())
                {
                    return (decimal)db.FN_Promedio_Credito(IdEmpleado);
                }
            }

            catch (SqlException ex)
            {
                NumeroError = ex.ErrorCode;
                MensajeError = ex.Message;

                return 1;
            }

            catch (Exception e)
            {
                MensajeError = e.Message;

                return 1;
            }
        }

        private DataTable CoutaTotalPagar()
        {
            try
            {
                DataTable dt = new DataTable();

                using (dtacls_GimnasioDataContext db = new dtacls_GimnasioDataContext())
                {
                    ISingleResult<SP_Seleccionar_Couta_Total_PagarResult> resultado = db.SP_Seleccionar_Couta_Total_Pagar(IdEmpleado);

                        dt = cls_Adaptador.ToDataTable(resultado.ToList());
                }

                return dt;
            }

            catch (SqlException ex)
            {
                NumeroError = ex.ErrorCode;
                MensajeError = ex.Message;

                return null;
            }

            catch (Exception e)
            {
                MensajeError = e.Message;

                return null;
            }
        }

        #endregion

    }
}
